package io.renren.modules.weixin.util;


import io.renren.modules.weixin.entity.*;
import net.sf.json.JSONObject;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;

import java.io.IOException;

public class WeixinUtil {
	// 从微信后台拿到APPID和APPSECRET 并封装为常量
	public static final String APPID = "wx956f349a9801e77b";
	public static final String APPSECRET = "30662719aef6535c6a437f1f08dc99ca";
	public static final String redirectUrl = "http://ngrok.kuaizi56.com:99/#/tomine";
	public static final String mine = "http://ngrok.kuaizi56.com:99/#/mine";
	// 这个url的域名必须要进行再公众号中进行注册验证，这个地址是成功后的回调地址
	public static final String backUrl = "http://one.i.sky123.live/index/weixin/wxcallback";


	public static final String ACCESS_TOKEN_URL = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET";

	/**
	 * 编写Get请求的方法。但没有参数传递的时候，可以使用Get请求
	 *
	 * @param url
	 *            需要请求的URL
	 * @return 将请求URL后返回的数据，转为JSON格式，并return
	 */
	public static JSONObject doGetStr(String url) throws ClientProtocolException, IOException {
		DefaultHttpClient client = new DefaultHttpClient();// 获取DefaultHttpClient请求
		HttpGet httpGet = new HttpGet(url);// HttpGet将使用Get方式发送请求URL
		JSONObject jsonObject = null;
		HttpResponse response = client.execute(httpGet);// 使用HttpResponse接收client执行httpGet的结果
		HttpEntity entity = response.getEntity();// 从response中获取结果，类型为HttpEntity
		if (entity != null) {
			String result = EntityUtils.toString(entity, "UTF-8");// HttpEntity转为字符串类型
			jsonObject = JSONObject.fromObject(result);// 字符串类型转为JSON类型
		}
		return jsonObject;
	}

	public static com.alibaba.fastjson.JSONObject doGet(String url) throws IOException {
		com.alibaba.fastjson.JSONObject jsonObject = null;
        CloseableHttpClient client = HttpClients.createDefault();


        HttpGet httpGet = new HttpGet(url);
        HttpResponse response = client.execute(httpGet);
        HttpEntity entity = response.getEntity();

        if (entity != null) {
            String result = EntityUtils.toString(entity, "UTF-8");
            jsonObject = com.alibaba.fastjson.JSONObject.parseObject(result);
        }

       // httpGet.releaseConnection();
        return jsonObject;
    }

	/**
	 * 编写Post请求的方法。当我们需要参数传递的时候，可以使用Post请求
	 *
	 * @param url
	 *            需要请求的URL
	 * @param outStr
	 *            需要传递的参数
	 * @return 将请求URL后返回的数据，转为JSON格式，并return
	 */
	public static JSONObject doPostStr(String url, String outStr) throws ClientProtocolException, IOException {
		DefaultHttpClient client = new DefaultHttpClient();// 获取DefaultHttpClient请求
		HttpPost httpost = new HttpPost(url);// HttpPost将使用Get方式发送请求URL
		JSONObject jsonObject = null;
		httpost.setEntity(new StringEntity(outStr, "UTF-8"));// 使用setEntity方法，将我们传进来的参数放入请求中
		HttpResponse response = client.execute(httpost);// 使用HttpResponse接收client执行httpost的结果
		String result = EntityUtils.toString(response.getEntity(), "UTF-8");// HttpEntity转为字符串类型
		jsonObject = JSONObject.fromObject(result);// 字符串类型转为JSON类型
		return jsonObject;
	}

	/**
	 * 获取AccessToken
	 *
	 * @return 返回拿到的access_token及有效期
	 */
	public static AccessToken getAccessToken() throws ClientProtocolException, IOException {
		AccessToken token = new AccessToken();
		String url = ACCESS_TOKEN_URL.replace("APPID", APPID).replace("APPSECRET", APPSECRET);// 将URL中的两个参数替换掉
		JSONObject jsonObject = doGetStr(url);// 使用刚刚写的doGet方法接收结果
		if (jsonObject != null) { // 如果返回不为空，将返回结果封装进AccessToken实体类
			token.setToken(jsonObject.getString("access_token"));// 取出access_token
			token.setExpiresIn(jsonObject.getInt("expires_in"));// 取出access_token的有效期
		}
		return token;
	}

	public static void main(String[] args) throws ClientProtocolException, IOException {
		AccessToken accessToken = getAccessToken();
		System.out.println(accessToken.toString());
	}
	/**
	 * 组装菜单
	 *
	 * @return
	 */
	public static Menu initMenu() {
		Menu menu = new Menu();
		ClickButton button11 = new ClickButton();
		button11.setName("menu1");
		button11.setType("click");
		button11.setKey("11");
		ClickButton button12 = new ClickButton();
		button12.setName("menu2");
		button12.setType("click");
		button12.setKey("12");


		Button button1 = new Button();
		button1.setName("渠道介绍"); // 将11/12两个button作为二级菜单封装第一个一级菜单
		button1.setSub_button(new Button[] { button11, button12 });


		ViewButton button31 = new ViewButton();
		button31.setName("会员中心");
		button31.setType("view");
		//button31.setUrl("http://wtko7ntqfw.52http.tech/#/mine");
		button31.setUrl(mine);

		Button button2 = new Button();
		button2.setName("快速下单"); // 将21/22两个button作为二级菜单封装第二个二级菜单
		button2.setSub_button(new Button[] { button11, button12 });

		menu.setButton(new Button[] { button1, button31, button2 });// 将31Button直接作为一级菜单

		return menu;

	}

	public static int createMenu(String token, String menu) throws ClientProtocolException, IOException {
		int result = 0;
		String CREATE_MENU_URL = "https://api.weixin.qq.com/cgi-bin/menu/create?access_token=ACCESS_TOKEN";
		String url = CREATE_MENU_URL.replace("ACCESS_TOKEN", token);
		JSONObject jsonObject = doPostStr(url, menu);
		if (jsonObject != null) {
			result = jsonObject.getInt("errcode");
		}
		return result;

	}

}
